/*
 * 本源代码知识产权属于北京新叶至恒软件技术有限公司（NLTE）所有。
 * <P>
 * 本项目以Apache License Version 2.0协议发布，鼓励代码共享和尊重原作者的著作权，
 * <P>
 * 同样允许代码修改，再发布（作为开源或商业软件）。
 * <P>
 * 在延伸的代码中（修改和有源代码衍生的代码中）需要带有原来代码中的协议，
 * <P>
 * 商标，不得以任何形式删去“北京新叶至恒软件技术有限公司（NLTE）”的版权声明。
 * <P>
 * 北京新叶至恒软件技术有限公司官方网址：
 * <P>
 *
 *     http://www.nlte.cn
 *
 * <P>
 * NLTE主要服务于石油、化工、核电、建筑等传统企业，致力于传统行业的现代科技化转型，
 * <P>
 * 提供软件培训、软件研发（包括二次研发）、研发咨询、系统架构、高性能计算集群（HPC）搭建等一体化的专业服务。
 * <P>
 * 公司以“专于行业应用，用心铸造永恒”为核心价值。
 */
package cn.nlte.science.units;

import java.util.HashMap;

/**
 * 本类封装单位管理的常用操作
 * <P>
 *
 * @author yetao
 */
public class UnitUtils {

    private static final HashMap<String, DerivedUnit> unitMap = new HashMap<>();

    /**
     * 根据单位的名称，返回单位的实例，用本方法获取的单位实例均是单例的（推荐使用）
     * 
     * 如果传入的类名不正确，则返回null
     *
     * @param name 单位的名称，即单位的类名，如：ULength_m
     * @return
     */
    public static DerivedUnit getUnit(String name) {
        // 查看unitMap是否有此对象
        DerivedUnit unit = unitMap.get(name);
        if (unit == null) {
            try {
                unit = (DerivedUnit) Class.forName("cn.nlte.science.units." + getPackageName(name) + "." + name).newInstance();
                unitMap.put(name, unit);
            } catch (ClassNotFoundException | IllegalAccessException | InstantiationException ex) {
                return null;
            }
        }
        return unit;
    }

    /**
     * 解析包名
     *
     * @param className
     * @return
     */
    private static String getPackageName(String className) {
        String front = className.split("_")[0];
        try {
            return front.substring(1).toLowerCase();
        } catch (Exception ex) {
            return "";
        }
    }
}
